Skip to content

在 .NET 專案中使用 Microsoft.Office.Interop.Excel 的常見問題

TLDR

  • dotnet publish 不支援 COM 元件編譯,建議將轉換服務拆分為獨立的 .NET Framework Web API。
  • 執行時若出現 0x80070005 錯誤,需透過 dcomcnfg 給予 IIS 應用程式集區帳戶 DCOM 存取權限。
  • 若發生找不到檔案錯誤,需在系統目錄下手動建立 Desktop 資料夾,以供 Office 元件存取。
  • 此方案僅限 Windows 環境,且伺服器必須安裝 Microsoft Office。

在 .NET 專案中,若需將 Excel 轉換為 ODS 格式,常見做法是透過 Microsoft.Office.Interop.Excel 呼叫主機上的 Office 軟體進行另存新檔。此做法在開發環境運作正常,但在部署至 Server 時常會遇到編譯與權限問題。

dotnet publish 編譯異常

什麼情況下會遇到這個問題: 當專案使用 dotnet publish 指令進行發佈,且專案中引用了 COM 元件時。

由於 dotnet publish 使用的是 .NET SDK 內建的 MSBuild,其不支援 ResolveComReference 工作,導致編譯失敗並出現 error MSB4803

解決建議: 由於此問題目前無直接解法,建議將 ODS 轉換功能抽離,建立一個獨立的 .NET Framework Web API 服務。當系統需要轉換格式時,透過呼叫該 API 進行處理,以避開 .NET Core/5+ 環境對 COM 元件的限制。

執行時的錯誤處理流程

1. DCOM 元件權限不足

什麼情況下會遇到這個問題: 當 IIS 應用程式嘗試啟動 Excel COM 物件,但應用程式集區(Application Pool)帳戶缺乏足夠的 DCOM 權限時,會拋出 0x80070005 (E_ACCESSDENIED) 錯誤。

解決步驟:

  1. 按下 Win + R 並輸入 dcomcnfg 開啟元件服務。
  2. 依序展開:元件服務 > 電腦 > 我的電腦 > DCOM 設定
  3. 找到 Microsoft Excel Application,點擊右鍵選擇「內容」。
  4. 切換至「安全性」頁籤,在「存取權限」區塊點選「自訂」。
  5. 將對應的 IIS APPPOOL\{應用程式集區名稱} 加入使用者清單。
  6. 勾選「本機存取」與「遠端存取」權限。

2. Excel 檔案存取問題

什麼情況下會遇到這個問題: Excel COM 元件在執行時會嘗試存取使用者的 Desktop 資料夾,但 Windows Server 的系統服務帳戶預設並不存在此路徑。

解決步驟: 需根據安裝的 Office 位元版本,手動建立對應的 Desktop 資料夾:

  • 32 位元 Office:C:\Windows\SysWOW64\config\systemprofile\Desktop
  • 64 位元 Office:C:\Windows\System32\config\systemprofile\Desktop

注意事項

  • 此設定僅適用於 Windows 環境。
  • 伺服器端必須安裝 Microsoft Office。
  • 每次 Windows 更新後,建議重新檢查上述權限與目錄設定。

異動歷程

    • 初版文件建立。